#include <iostream>
#include <string>
#include <memory>
#include <cstring>
#include <memory.h>
using namespace std;

class Data
{
private:
public:
    Data()
    {
        cout << "Data()" << endl;
    }
    ~Data()
    {
        cout << "~Data()" << endl;
    }

    void Print()
    {
        cout << "Data Print" << endl;
    }
};

int main(int argc, char const *argv[])
{
    {
        // 申请一个空间交由 unique_ptr 智能指针管理
        unique_ptr<Data> ptr1(new Data);

        // 创建一个 unique_ptr 智能指针
        auto ptr2 = make_unique<Data>();

        // 类似原始指针一样的用法
        ptr1->Print();

        // 解引用获取对象
        (*ptr1).Print();

        // 获取原始指针
        Data *ptr1_ptr = ptr1.get();
    }
    cout << "__________________________" << endl;
    { // 智能指针 修改
        auto ptr3 = make_unique<Data>();
        ptr3.reset(new Data); // 释放原有空间
        ptr3.reset(nullptr);  // 释放空间

        // 释放控制权
        auto ptr4 = make_unique<Data>();
        Data *ptr4_ptr = ptr4.release(); // 释放对原始指针的控制权，并放回原始指针
        delete ptr4_ptr;                 // 自己释放空间
    }
    cout << "__________________________" << endl;
    { // 智能指针的移动
        auto ptr5 = make_unique<Data>();
        unique_ptr<Data> ptr6;
        ptr6 = move(ptr5); // 需要使用 move() 来移动控制权
    }
    cout << "__________________________" << endl;
    return 0;
}
